Skip to content
Why did we open-source our inference engine? Read the post

Quickstart

SIE’s primary target is x86 Linux nodes with NVIDIA GPUs. The CPU image lets you try everything locally; for production deployment with autoscaling and multi-GPU, see Deployment.

Native install, served on Metal, no Docker (requires Python 3.12):

# embeddings + reranking (torch-MPS)
pip install "sie-server[local]" && sie-server serve # http://localhost:8080
# generation (Apple MLX) runs in its own env; uv makes it a one-liner
# (or pip install "sie-server" "mlx-lm>=0.30.7" into a fresh venv)
uvx --with "mlx-lm>=0.30.7" --from sie-server sie-server serve -b sglang -p 8081

Or run the Linux CPU image under emulation:

docker run --platform linux/amd64 -p 8080:8080 \
-v sie-hf-cache:/app/.cache/huggingface \
ghcr.io/superlinked/sie-server:latest-cpu-default

The server starts on port 8080 with all models available. Models load on first request.

pip install sie-sdk
from sie_sdk import SIEClient
from sie_sdk.types import Item
client = SIEClient("http://localhost:8080")
# Single item
result = client.encode("sentence-transformers/all-MiniLM-L6-v2", Item(text="Hello world"))
print(result["dense"].shape) # (384,)
# Batch
results = client.encode("sentence-transformers/all-MiniLM-L6-v2", [
Item(text="First document"),
Item(text="Second document"),
])
print(len(results)) # 2

The first call to a model downloads its weights from Hugging Face and loads them; all-MiniLM-L6-v2 is ~90MB, so the first result lands in seconds to a couple of minutes, and warm calls typically return in milliseconds. When you want a multilingual flagship embedder with dense and sparse output, swap the model ID to BAAI/bge-m3 (~2.3GB download on first use); the call stays identical.

query = Item(text="What is machine learning?")
items = [
Item(text="Machine learning uses algorithms to learn from data."),
Item(text="The weather is sunny today."),
]
result = client.score("cross-encoder/ms-marco-MiniLM-L-6-v2", query, items)
for entry in result["scores"]:
print(f"Rank {entry['rank']}: score={entry['score']:.3f}")
# Rank 0: score=-7.104
# Rank 1: score=-11.048
# (cross-encoder logits; the relative order is what matters)
result = client.extract(
"urchade/gliner_multi-v2.1",
Item(text="Tim Cook is the CEO of Apple."),
labels=["person", "organization"]
)
for entity in result["entities"]:
print(f"{entity['label']}: {entity['text']}")
# person: Tim Cook
# organization: Apple

Text generation runs on the GPU generation image, not the CPU image above; stop the first server, then start this one on the same port. On Apple Silicon, generation is the separate MLX process from the platform tab above, which serves on port 8081, so create the client against http://localhost:8081 for this step.

docker run --gpus all -p 8080:8080 \
-v sie-hf-cache:/app/.cache/huggingface \
ghcr.io/superlinked/sie-server:latest-cuda12-sglang
# On Apple Silicon: client = SIEClient("http://localhost:8081")
result = client.generate(
"Qwen/Qwen3-0.6B",
"Reply with a single word: the capital of France.",
max_new_tokens=16,
temperature=0.0,
)
print(result["text"]) # Paris

generate is an early surface: the blocking call returns the full result once generation finishes. For streaming and chat-shaped requests, see Text Generation.

Contact us

Tell us about your use case and we'll get back to you shortly.